package utilities;

import entity.Adesione;
import entity.Annuncio;
import entity.UtenteRegistrato;
import java.io.IOException;
import java.util.GregorianCalendar;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import statefulSB.UtenteLoggatoLocal;

/**
 * Metodi di utilità per le servlet e le jsp.
 * @author ale
 */
public class Utilities {

    /**
     * Metodo per recuperare l'utente correntemente loggato
     * @param request richiesta ricevuta dalla servlet o jsp
     * @return l'utente correntemente loggato se c'è un utente loggato, null altrimenti
     */
    public static UtenteRegistrato getUtenteLoggato(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if (session == null) {
//            System.out.println("session is null");
            return null;
        }
//        if (session.isNew()){
//            System.out.println("session is new");
//        }
//        else{
//            System.out.println("session is NOT new");
//        }
        UtenteLoggatoLocal ull = (UtenteLoggatoLocal) session.getAttribute("utenteLoggato");
        if (ull == null) {
//            System.out.println("ull is null");
            return null;
        } else {
//            System.out.println("ull is NOT null, ull.getUtente="+ull.getUtente());
            return ull.getUtente();
        }
    }

    /**
     * Metodo per recuperare il session bean che mantiene le informazioni relative
     * alla sessione corrente (ad esempio, l'utente loggato)
     * @param request richiesta ricevuta dalla servlet o jsp
     * @return il session bean con le informazioni sulla sessione corrente
     */
    public static UtenteLoggatoLocal getUtenteLoggatoLocal(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if (session == null) {
            return null;
        }
        UtenteLoggatoLocal ull = (UtenteLoggatoLocal) session.getAttribute("utenteLoggato");
        return ull;
    }

    /**
     * Metodo per formattare una data per esteso (es. 1 gennaio 2012)
     * @param d la data da formattare
     * @return una stringa contenente la data formattata
     */
    public static String formattaData(GregorianCalendar d) {
        String[] mesi = {"gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"};
        return d.get(GregorianCalendar.DAY_OF_MONTH) + " " + mesi[d.get(GregorianCalendar.MONTH)] + " " + d.get(GregorianCalendar.YEAR);
    }

    /**
     * Metodo per redirigere una request verso un'altra servlet o jsp
     * @param where path della servlet/jsp da invocare
     * @param request richiesta da redirigere
     * @param response response da redirigere
     * @throws ServletException se la risorsa da invocare lancia questa eccezione
     * @throws IOException se la risorsa da invocare lancia questa eccezione
     */
    public static void forward(String where, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher rd = request.getServletContext().getRequestDispatcher(where);
        rd.forward(request, response);
    }

    /**
     * Metodo per includere un'altra servlet o jsp
     * @param where path della servlet/jsp da invocare
     * @param request richiesta da redirigere
     * @param response response da redirigere
     * @throws ServletException se la risorsa da invocare lancia questa eccezione
     * @throws IOException se la risorsa da invocare lancia questa eccezione
     */
    public static void include(String where, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher rd = request.getServletContext().getRequestDispatcher(where);
        rd.include(request, response);
    }

    /**
     * Metodo per fornire in modo standare un messaggio di errore all'utente
     * @param message messaggio di errore
     * @param request richiesta da redirigere
     * @param response response da redirigere
     * @throws ServletException se la risorsa da invocare lancia questa eccezione
     * @throws IOException se la risorsa da invocare lancia questa eccezione
     */
    public static void errore(String message, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("errore", message);
        forward("/paginaErrore.jsp", request, response);
    }

    /**
     * Metodo per mostrare gli annunci creati dall'utente loggato, espandendo 
     * l'annuncio in input in modo da mostrarne i dettagli
     * @param request richiesta da redirigere
     * @param response da redirigere
     * @param a eventuale annuncio da mostrare
     * @throws ServletException se la risorsa da invocare lancia questa eccezione
     * @throws IOException se la risorsa da invocare lancia questa eccezione
     */
    public static void mostraAnnunciCreati(HttpServletRequest request, HttpServletResponse response, Annuncio a) throws ServletException, IOException {
        request.setAttribute("show", "creati");
        request.setAttribute("annuncio", a);
        Utilities.forward("/index.jsp", request, response);
    }

    /**
     * Metodo per mostrare gli annunci a cui l'utente loggato è iscritto, espandendo 
     * l'adesione in input in modo da mostrarne i dettagli
     * @param request richiesta da redirigere
     * @param response da redirigere
     * @param adesione eventuale adesione da mostrare
     * @throws ServletException se la risorsa da invocare lancia questa eccezione
     * @throws IOException se la risorsa da invocare lancia questa eccezione
     */
    public static void mostraAnnunciIscritto(HttpServletRequest request, HttpServletResponse response, Adesione adesione) throws ServletException, IOException {
        request.setAttribute("show", "iscritto");
        request.setAttribute("adesione", adesione);
        Utilities.forward("/index.jsp", request, response);
    }

    /**
     * Metodo per arrotondare ad al più due cifre decimali il nuemro in input
     * @param d numero da arrotondare
     * @return il numero arrotondato
     */
    public static double arrotonda(double d) {
        return (Math.ceil(d * 100)) / 100;
    }
}